//package com.talos.service.codegen;
//
//
//
//import com.talos.framework.common.constant.SystemConstant;
//
//import java.io.BufferedWriter;
//import java.io.File;
//import java.io.FileWriter;
//import java.io.IOException;
//import java.util.Arrays;
//import java.util.regex.Matcher;
//import java.util.stream.Collectors;
//
//public class ServiceStructureMaker {
//
//    private final String[] ENTITY_PACKAGES = {
//            "entity"
//    };
//
//    private final String[] GENERATOR_PACKAGES = {
//            "generator"
//    };
//
//    private final String[] SERVICE_PACKAGES = {
//            "consumer", "convertor", "event", "helper", "job", "listener",
//            "manager", "mapper", "model", "producer", "repository", "service", "service.impl"
//    };
//
//    private final String[] WEB_PACKAGES = {
//            "api.impl", "controller.admin", "controller.home"
//    };
//
//    private final String[] CONSTANT_PACKAGES = {
//            "constant"
//    };
//
//    private final String[] ENUMS_PACKAGES = {
//            "enums"
//    };
//
//    private final String[] FEIGN_PACKAGES = {
//            "feign.api", "feign.fallback", "feign.dto", "feign.vo"
//    };
//
//    private final String JAVA_DIR = GeneratorUtils.joinPathsFirst("src", "main", "java");
//
//    private final String RESOURCES_DIR = GeneratorUtils.joinPaths("src", "main", "resources");
//
//    private final String baseName;
//
//    private final String commonName;
//
//    private final String projectName;
//
//    private final String basePackage;
//
//    private final String basePackagePath;
//
//    private final String serverPort;
//
//    private final String redisDatabase;
//
//    public ServiceStructureMaker(String projectName, String serverPort, String redisDatabase) {
//        this.baseName = SystemConstant.NAME + "-" + projectName;
//
//        this.commonName = SystemConstant.NAME + "-common-" + projectName;
//
//        this.projectName = SystemConstant.NAME + "-service-" + projectName;
//
//        this.basePackage = SystemConstant.SUFFIX + "." + SystemConstant.NAME + "." + projectName.replaceAll("-", ".");
//
//        this.basePackagePath = this.basePackage.replace(".", Matcher.quoteReplacement(File.separator));
//
//        this.serverPort = serverPort;
//
//        this.redisDatabase = redisDatabase;
//    }
//
//    public void generic() {
//        System.out.println("项目初始化开始");
//
//        File projectDir = new File(SystemConstant.NAME + "-service" + Matcher.quoteReplacement(File.separator) + this.projectName);
//
//        this.mkdir(projectDir);
//
//        this.writeFile(
//                GeneratorUtils.joinPathsLast(projectDir.getAbsolutePath()) + "pom.xml",
//                PomContent.getProject(this.baseName, this.projectName)
//        );
//
//        this.writeFile(
//                GeneratorUtils.joinPathsLast(projectDir.getAbsolutePath()) + ".gitignore",
//                IgnoreContent.getGit()
//        );
//
//        this.genericEntity(projectDir);
//        this.genericGenerator(projectDir);
//        this.genericService(projectDir);
//        this.genericWeb(projectDir);
//        this.genericCommon();
//
//        System.out.println("项目初始化结束");
//    }
//
//    private void genericEntity(File projectDir) {
//        this.generateModule(
//                projectDir,
//                "entity",
//                ENTITY_PACKAGES,
//                PomContent.getEntity(this.baseName, this.projectName)
//        );
//    }
//
//    private void genericGenerator(File projectDir) {
//        File moduleDir = this.generateModule(
//                projectDir,
//                "generator",
//                GENERATOR_PACKAGES,
//                PomContent.getGenerator(this.baseName, this.projectName)
//        );
//
//        this.generateGenerator(moduleDir);
//    }
//
//    private void genericService(File projectDir) {
//        this.generateModule(
//                projectDir,
//                "service",
//                SERVICE_PACKAGES,
//                PomContent.getService(this.baseName, this.projectName)
//        );
//    }
//
//    private void genericWeb(File projectDir) {
//        File moduleDir = this.generateModule(
//                projectDir,
//                "web",
//                WEB_PACKAGES,
//                PomContent.getWeb(this.baseName, this.projectName)
//        );
//
//        this.generateApplication(moduleDir);
//
//        this.generateResources(moduleDir);
//    }
//
//    private void genericCommon() {
//        File file = new File(SystemConstant.NAME + "-common" + Matcher.quoteReplacement(File.separator) + this.commonName);
//
//        this.mkdir(file);
//
//        this.writeFile(
//                GeneratorUtils.joinPathsLast(file.getAbsolutePath()) + "pom.xml",
//                PomContent.getCommon(this.baseName, this.commonName, this.projectName)
//        );
//
//        this.writeFile(
//                GeneratorUtils.joinPathsLast(file.getAbsolutePath()) + ".gitignore",
//                IgnoreContent.getGit()
//        );
//
//        this.generateModule(
//                file,
//                "constant",
//                CONSTANT_PACKAGES,
//                PomContent.getConstant(this.baseName, this.commonName, this.projectName)
//        );
//
//        this.generateModule(
//                file,
//                "enums",
//                ENUMS_PACKAGES,
//                PomContent.getEnum(this.baseName, this.commonName, this.projectName)
//        );
//
//        this.generateModule(
//                file,
//                "feign",
//                FEIGN_PACKAGES,
//                PomContent.getFeign(this.baseName, this.commonName, this.projectName)
//        );
//    }
//
//    private File generateModule(File projectDir, String moduleName, String[] subPackages, String pomContent) {
//        File moduleDir = new File(projectDir, this.baseName + "-" + moduleName);
//
//        File packageDir = new File(moduleDir, GeneratorUtils.joinPaths(JAVA_DIR, this.basePackagePath));
//
//        this.mkdir(packageDir);
//
//        for (String subPackage : subPackages) {
//            this.mkdir(new File(packageDir, subPackage.replace(".", Matcher.quoteReplacement(File.separator))));
//        }
//
//        this.writeFile(GeneratorUtils.joinPathsLast(moduleDir.getAbsolutePath()) + "pom.xml", pomContent);
//        this.writeFile(GeneratorUtils.joinPathsLast(moduleDir.getAbsolutePath()) + ".gitignore", IgnoreContent.getGit());
//
//        return moduleDir;
//    }
//
//    private void generateApplication(File moduleDir) {
//        String className = Arrays.stream(this.baseName.split("-"))
//                .map(s -> s.substring(0, 1).toUpperCase() + s.substring(1))
//                .collect(Collectors.joining());
//
//        File packageDir = new File(moduleDir, GeneratorUtils.joinPaths(JAVA_DIR, this.basePackagePath));
//
//        String path = GeneratorUtils.joinPaths(packageDir.getAbsolutePath(), className) + "WebApplication.java";
//
//        this.writeFile(path, ApplicationContent.getDefault(className, this.basePackage));
//    }
//
//    private void generateGenerator(File moduleDir) {
//        String className = Arrays.stream(this.baseName.split("-"))
//                .map(s -> s.substring(0, 1).toUpperCase() + s.substring(1))
//                .collect(Collectors.joining());
//
//        File packageDir = new File(moduleDir, GeneratorUtils.joinPaths(JAVA_DIR, this.basePackagePath, "generator"));
//
//        String path = GeneratorUtils.joinPaths(packageDir.getAbsolutePath(), className) + "Generator.java";
//
//        this.writeFile(path, GeneratorContent.getDefault(className, this.baseName, this.projectName, this.basePackage));
//    }
//
//    private void generateResources(File moduleDir) {
//        File resourcesDir = new File(moduleDir, RESOURCES_DIR);
//
//        this.mkdir(resourcesDir);
//        this.mkdir(new File(resourcesDir, "migrations"));
//
//        String path = GeneratorUtils.joinPathsLast(resourcesDir.getAbsolutePath());
//
//        this.writeFile(path + "bootstrap.yml", BootstrapContent.getDefault(this.baseName, this.serverPort, this.redisDatabase));
//        this.writeFile(path + "bootstrap-local.yml", BootstrapContent.getLocal(this.baseName));
//        this.writeFile(path + "bootstrap-dev.yml", BootstrapContent.getDev());
//        this.writeFile(path + "bootstrap-fat.yml", BootstrapContent.getFat());
//        this.writeFile(path + "bootstrap-uat.yml", BootstrapContent.getUat());
//        this.writeFile(path + "bootstrap-pro.yml", BootstrapContent.getPro());
//    }
//
//    private void writeFile(String target, String content) {
//        try {
//            BufferedWriter writer = new BufferedWriter(new FileWriter(target));
//
//            writer.write(content);
//
//            writer.close();
//        } catch (IOException ex) {
//            throw new RuntimeException(ex);
//        }
//    }
//
//    private void mkdir(File file) {
//        if (!file.exists() && !file.mkdirs()) {
//            throw new RuntimeException(String.format("文件创建失败:{%s}", file.getAbsoluteFile()));
//        }
//    }
//
//}
